package com.wu.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.wu.pojo.dto.DataBakDTO;
import com.wu.pojo.dto.RegisterDTO;
import com.wu.pojo.po.orgPo.DataBak;
import com.wu.pojo.po.orgPo.OrgBase;
import com.wu.pojo.res.Result;
import com.wu.pojo.dto.OrgFuzzyDTO;
import com.wu.service.DataBakService;
import com.wu.service.OrgBaseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import static com.wu.constants.Constants.PASS;
import static com.wu.constants.Constants.UNPASS;

/**
 * [机构信息管理接口功能]
 *
 * @Author : [wuzhengru]
 * @Version : [v1.0]
 * @Date : [2021/5/25 17:31]
 */
@RestController
@RequestMapping("/api/v1/orgBase")
@Slf4j
@Api(tags = "机构信息管理接口", description = "OrgBaseController")
public class OrgBaseController {

    @Reference
    private OrgBaseService orgBaseService;
    @Reference
    private DataBakService dataBakService;

    @ApiOperation("新增、更新企业信息")
    @PutMapping
    public Result OrgUser(@Valid @RequestBody RegisterDTO orgUser,
                          BindingResult result) throws Exception {

        // 1、校验校验
        Result res = Commonts.getErrors(result);
        if (!(null == res || "".equals(res))) {
            // return校验错误
            return Commonts.getErrors(result);
        }

        // Valid校验有重叠，单独校验contIdcard
        if (null == orgUser.getContIdcard() || "".equals(orgUser.getContIdcard())) {
            return Result.fail("联系人身份证号不能为空");
        }

        // 初始化机构基本信息
        OrgBase orgInit = orgUser.orgInit();

        // 不存在 add机构
        if (null == orgBaseService.selectOne(new OrgBase().setOrgId(orgInit.getOrgId())) || "".equals(orgBaseService.selectOne(new OrgBase().setOrgId(orgInit.getOrgId())))) {
            orgBaseService.insertOrg(orgInit);
            return Result.succ(null);
        }

        // 存在 更新
        // STATUS = 1 待审核
        orgInit.setStatus("1");
        orgBaseService.updateOrg(orgInit);
        return Result.succ("更新成功");
    }

    @RequiresRoles("admin")
    @ApiOperation("查询审核结果")
    @GetMapping("checkResults")
    public Result checkResults(@RequestParam String orgId) {

        // 1、参数校验
        OrgBase orgById = orgBaseService.selectById(orgId);

        String orgName = orgById.getOrgName();
        String status = orgById.getStatus();
        String remark = orgById.getRemark();

        // 转换日期格式
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String updateTime = null;
        try {
            updateTime = formatter.format(orgById.getUpdateTime());
        } catch (Exception e) {
            log.debug("无更新时间");
        }
        // 展示
        JSONObject data = new JSONObject();
        data.put("orgName", orgName);
        data.put("updateTime", updateTime);
        data.put("status", status);
        data.put("remark", remark);

        return Result.succ(data);
    }

    @RequiresRoles("admin")
    @ApiOperation("查询所有机构信息")
    @GetMapping("getAll")
    public List<OrgBase> getAll() {
        return orgBaseService.selectList(null);

    }

    @RequiresRoles("admin")
    @ApiOperation("审核机构信息-查询待审核和审核未通过机构")
    @GetMapping("getCheck")
    public Result getCheck() {
        // 1、参数校验

        // 2、查询
        return Result.succ(dataBakService.queryList());
    }

    @RequiresRoles("admin")
    @ApiOperation("审核机构信息-查询待审核和审核未通过机构-模糊查询")
    @PostMapping("fuzzyCheck")
    public Result fuzzyCheck(@RequestBody OrgFuzzyDTO orgFuzzyDTO) {
        // 1、参数校验

        // 2、查询
        List<OrgBase> orgBases = orgBaseService.selectFuzzy(orgFuzzyDTO);

        // 3、组装参数
        JSONArray jsonArray = new JSONArray();

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        for (OrgBase orgBase : orgBases) {
            String checkTime = null;
            String updateTime = null;
            try {
                checkTime = formatter.format(orgBase.getCheckTime());
                updateTime = formatter.format(orgBase.getUpdateTime());
            } catch (Exception e) {
                log.debug("暂未审核");
            }
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("orgId", orgBase.getOrgId());
            jsonObject.put("orgName", orgBase.getOrgName());
            jsonObject.put("updateTime", updateTime);
            jsonObject.put("status", orgBase.getStatus());
            jsonObject.put("checkTime", checkTime);
            jsonObject.put("remark", orgBase.getRemark());
            jsonArray.add(jsonObject);
        }
        return Result.succ(jsonArray);
    }

    @RequiresRoles("admin")
    @ApiOperation("审核机构信息-查询审核内容")
    @GetMapping("orgCheck")
    public Result orgCheck(@RequestParam String orgId) {

        // 1、参数校验
        if (null == orgId || "".equals(orgId)) {
            log.info("非法信息");
            return Result.fail("非法信息");
        }

        // 2、查询
        return Result.succ(orgBaseService.selectById(orgId));
    }

    @RequiresRoles("admin")
    @ApiOperation("审核机构信息-审核结果")
    @PutMapping(value = "check")
    public Result check(@RequestBody OrgBase orgBase, BindingResult result) {

        // 1、参数校验
        Result res = Commonts.getErrors(result);
        if (!(null == res || "".equals(res))) {// return校验错误
            return Commonts.getErrors(result);
        }

        if (null == orgBase.getStatus() || "".equals(orgBase.getStatus())) {
            return Result.fail("未做更改");
        }

        if (orgBaseService.selectById(orgBase.getOrgId()).getStatus().equals(orgBase.getStatus())) {
            return Result.fail("已审核完成，请勿重复审核");
        }

        // 2、更新审核结果
        orgBase.setCheckTime(new Date());
        orgBaseService.updateOrg(orgBase);
        return Result.succ("审核完成");
    }

    @RequiresRoles("admin")
    @ApiOperation("修改手机号-查询新手机号信息")
    @GetMapping("getMobileCheck")
    public Result getMobileCheck() {
        // 1、水平越权校验

        // 2、查询修改手机号列表
        List<DataBakDTO> mobileChecks = dataBakService.queryList();

        // 3、格式转换
        JSONArray jsonArray = new JSONArray();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        for (DataBakDTO mobileCheck : mobileChecks) {
            String createTime = null;
            String updateTime = null;
            try {
                createTime = formatter.format(mobileCheck.getCreateTime());// 申请时间
                updateTime = formatter.format(mobileCheck.getUpdateTime());// 审核时间
            } catch (Exception e) {
                log.debug("暂未审核");
            }

            // 4、参数组装
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("orgId", mobileCheck.getOrgId());
            jsonObject.put("orgName", mobileCheck.getOrgName());
            jsonObject.put("createTime", createTime);
            jsonObject.put("updateTime", updateTime);
            jsonObject.put("status", mobileCheck.getStatus());
            jsonArray.add(jsonObject);
        }
        return Result.succ(jsonArray);
    }

    @RequiresRoles("admin")
    @ApiOperation("修改手机号-查询审核内容")
    @GetMapping("checkMobileInfo")
    public Result checkMobileInfo(@RequestParam String orgId) {

        // 1、参数校验
        if (null == orgId || "".equals(orgId)) {
            log.info("非法信息");
            return Result.fail("非法信息");
        }

        // 2、查询
        return Result.succ(dataBakService.queryByOrgId(orgId));
    }

    @RequiresRoles("admin")
    @ApiOperation("修改手机号-审核结果")
    @PutMapping(value = "checkRes")
    public Result checkRes(@RequestBody DataBakDTO dataBakDTO, BindingResult result) {

        // 1、参数校验
        Result res = Commonts.getErrors(result);
        if (!(null == res || "".equals(res))) {// return校验错误
            return Commonts.getErrors(result);
        }
        String orgId = dataBakDTO.getOrgId();
        if (dataBakService.queryByOrgId(orgId).getStatus().equals(dataBakDTO.getStatus())) {
            // 检查temp表
            return Result.fail("已审核完成，请勿重复审核");
        }

        // 审核状态 0-通过 1-未通过
        String status = dataBakDTO.getStatus();
        // 数据预处理
        OrgBase orgBase = new OrgBase();// 修改orgbase表手机号
        DataBak dataBak = new DataBak();// 修改bak表状态

        // 2、更新审核结果
        if (PASS.equals(status)) { // 通过
            orgBase.setOrgId(dataBakDTO.getOrgId())
                    .setMobile(dataBakDTO.getBakMobile());
            dataBak.setStatus(PASS);
            dataBak.setBakId(dataBakDTO.getOrgId());
            // 修改
            orgBaseService.updateOrg(orgBase);// 不要更改base表的审核时间
            dataBakService.update(dataBak);
        } else { // 未通过
            dataBak.setStatus(UNPASS);
            dataBak.setBakId(dataBakDTO.getOrgId());
            // 修改
            dataBakService.update(dataBak);
        }

        return Result.succ("审核完成");
    }

}
